<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of UsuarioDAO
 *
 * @author thales
 */
class UsuarioDAO {
    public $conn = null;
    
    public function __construct() {
        $this->conn = DB::getConn();
    }
    
    /**
     * Método responsável por validar o usuário para o login.
     * 
     * @param UsuarioVO $objUsuario
     * @return UsuarioVO $objUsuario 
     */
    public function validar(UsuarioVO $objUsuario ){
        $sql = 'select 
                    id,
                    nome
                from
                    usuario
                where
                    email = ? and
                    senha = ?';
        
        $stt = $this->conn->prepare($sql);  
        $stt->bindValue(1, $objUsuario->getEmail());
        $stt->bindValue(2, $objUsuario->getSenha());
        
        if ( !$stt->execute() ){
            throw new UserException('Acesso indisponível no momento! <br> Tente mais tarde!');
        } 
        
        $usuario = $stt->fetch(PDO::FETCH_ASSOC);

        if(!$usuario){
            throw new UserException('Dados de acesso inválidos!');
        }    
        
        $objUsuario->setId($usuario['id']);
        $objUsuario->setNome($usuario['nome']);
        
        return true;
    }
    
    /**
     * Método responsávelpor inserir um novo usuário.
     * 
     * @param UsuarioVO $objUsuario
     * @return Último id do usuário inserido 
     */
    public function salvar(UsuarioVO $objUsuario){
        $sql = 'Insert into usuario (nome,email,senha) values (?,?,?)';
        
        $stt = $this->conn->prepare($sql);  
        $stt->bindValue(1, $objUsuario->getNome(),PDO::PARAM_STR);
        $stt->bindValue(2, $objUsuario->getEmail(),PDO::PARAM_STR);
        $stt->bindValue(3, $objUsuario->getSenha(),PDO::PARAM_STR);
        
        if ( !$stt->execute() ){
            throw new Exception('Não foi possível salvar o usuário!<br>' . var_dump($stt->errorInfo()) );
        } 
        
        $usuarioId = $this->conn->lastInsertId();
        
        LogDAO::getInstance()->salvar(__METHOD__, $this->conn->lastInsertId(), __CLASS__);
        
        return $usuarioId;
        
    }
    
    /**
     * Método responsávelpor alterar os dados do usuário
     * 
     * @param UsuarioVO $objUsuario
     */
    public function alterar(UsuarioVO $objUsuario){
        $sql = 'Update 
                    usuario 
                set 
                    nome = :nome,
                    email = :email';
        
        if ( $objUsuario->getSenha() != '' ) {
            $sql .=', senha = :senha ';
        }
        $sql .='
                where
                    id = :id';
        
        $nome = $objUsuario->getNome();
        $email = $objUsuario->getEmail();
        $senha = $objUsuario->getSenha();
        $id = $objUsuario->getId();
        
        $stt = $this->conn->prepare($sql);  
        $stt->bindParam(':nome', $nome);
        $stt->bindParam(':email', $email);

        if ( $objUsuario->getSenha() != '' ) {
            $stt->bindParam(':senha', $senha);
        }
        $stt->bindParam(':id', $id);
        
        if ( !$stt->execute() ){
            throw new Exception('Não foi possível alterar os dados do usuário!<br>' . var_dump($stt->errorInfo()) );
        } 
        
        LogDAO::getInstance()->salvar(__METHOD__, $id, __CLASS__);
        
        return true;
        
    }
    
    /**
     * Método responsável por buscar todos os dados do usuário.<br>
     * 
     * @param UsuarioBO $objUsuarioBO
     */
    public function pesquisarDados(UsuarioBO $objUsuarioBO){
        $sql = 'select 
                    a.id as idUsuario,
                    a.nome,
                    a.email,
                    b.id as idUsuarioPerfil,
                    b.usuario_id,
                    b.perfil_id,
                    c.id as idPerfil,
                    c.descricao
                from
                    usuario a
                inner join 
                    usuarioPerfil b on a.id = b.usuario_id
                inner join
                    perfil c on b.perfil_id = c.id
                where
                    nome like ? or
                    email like ?';
                
        
        $stt = $this->conn->prepare($sql);  
        $stt->bindValue(1, $objUsuarioBO->getUsuario()->getNome(),PDO::PARAM_STR);
        $stt->bindValue(2, $objUsuarioBO->getUsuario()->getEmail(),PDO::PARAM_STR);
        
        if ( !$stt->execute() ){
            throw new Exception('Não foi possível pesquisar os dados do usário!' . __METHOD__ );
        } 

        $listaObjUsuarioBO = array();
        while( $tmp = $stt->fetch(PDO::FETCH_ASSOC) ){
            
            $objUsuarioBO = new UsuarioBO();
            $objUsuarioBO->getUsuario()->setId($tmp['idUsuario']);
            $objUsuarioBO->getUsuario()->setNome($tmp['nome']); 
            $objUsuarioBO->getUsuario()->setEmail($tmp['email']);
           
            
            $objUsuarioBO->getPerfil()->setId($tmp['idPerfil']);
            $objUsuarioBO->getPerfil()->setDescricao($tmp['descricao']);
            
            $objUsuarioBO->getUsuarioPerfil()->setId($tmp['idUsuarioPerfil']);
            $objUsuarioBO->getUsuarioPerfil()->setUsuarioId($tmp['usuario_id']);
            $objUsuarioBO->getUsuarioPerfil()->setPerfilId($tmp['perfil_id']);
            
            $listaObjUsuarioBO[] = $objUsuarioBO;
            
        }
        
        return $listaObjUsuarioBO;
    }
    
    /**
     * Método responsável por pegar os dados do usuário.<br>
     * 
     * @param DadosUsuarioBO $objUsuarioBO
     */
    public function pesquisar( UsuarioBO $objUsuarioBO){
        $sql = 'select 
                    a.id as idUsuario,
                    a.nome,
                    a.email,
                    b.id as idUsuarioPerfil,
                    b.usuario_id,
                    b.perfil_id,
                    c.id as idPerfil,
                    c.descricao
                from
                    usuario a
                inner join 
                    usuarioPerfil b on a.id = b.usuario_id
                inner join
                    perfil c on b.perfil_id = c.id
                where
                    a.id = ?';
        
        $stt = $this->conn->prepare($sql);  
        $stt->bindValue(1, $objUsuarioBO->getUsuario()->getId(),PDO::PARAM_INT);
        
        
        
        if ( !$stt->execute() ){
            throw new Exception('Não foi possível pegar os dados do usuário!' . __METHOD__ );
        } 

        $tmp = $stt->fetch(PDO::FETCH_ASSOC);
        
        $objUsuarioBO->getUsuario()->setId($tmp['idUsuario']);
        $objUsuarioBO->getUsuario()->setNome($tmp['nome']);
        $objUsuarioBO->getUsuario()->setEmail($tmp['email']);

        $objUsuarioBO->getPerfil()->setId($tmp['idPerfil']);
        $objUsuarioBO->getPerfil()->setDescricao($tmp['descricao']);

        $objUsuarioBO->getUsuarioPerfil()->setId($tmp['idUsuarioPerfil']);
        $objUsuarioBO->getUsuarioPerfil()->setUsuarioId($tmp['usuario_id']);
        $objUsuarioBO->getUsuarioPerfil()->setPerfilId($tmp['perfil_id']);
            
        return true;   
    }
    
    /**
     * Método que valida a autorização do usuário.
     * 
     * @param UsuarioVO $objUsuario
     * @return boolean 
     */
    public function validarAutorizacao(UsuarioVO $objUsuario ){
        $sql = 'select 
                    id,
                    nome
                from
                    usuario
                where
                    id = ? and
                    senha = ?';
        
        $stt = $this->conn->prepare($sql);  
        $stt->bindValue(1, $objUsuario->getId());
        $stt->bindValue(2, $objUsuario->getSenha());
        
        if ( !$stt->execute() ){
            throw new UserException('Acesso indisponível no momento! <br> Tente mais tarde!');
        } 
        
        $usuario = $stt->fetch(PDO::FETCH_ASSOC);
        
        if ( !$usuario ) {
            return false;
        }

        $objUsuario->setId($usuario['id']);
        $objUsuario->setNome($usuario['nome']);
        
        return true;
    }
    
    /**
     * Método para excluir um usuário do sistema.
     * 
     * @param UsuarioVO $objUsuarioVO
     * @return boolean 
     */
    public function excluir(UsuarioVO $objUsuarioVO ){
        $sql = 'delete from usuario where id = ?';
        
        $stt = $this->conn->prepare($sql);
        $stt->bindValue(1, $objUsuarioVO->getId(), PDO::PARAM_INT);
        
        if ( !$stt->execute() ){
            throw new Exception('Não foi possível salvar o cliente!<br>' . var_dump($stt->errorInfo()) );
        } 
        
        LogDAO::getInstance()->salvar(__METHOD__, $objUsuarioVO->getId(), __CLASS__);
        
        return true;
    }
}

?>
